/*** 本文件由CSMIS2.0-ModelCreater(UTF-8)工具辅助生成，版本1.0 ***/

package com.ce.sys.msg.action;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.ce.framework.datamaintain.action.DataMaintainAction;
import com.ce.framework.datamaintain.logic.ISQLMapper;
import com.ce.framework.exception.AppException;
import com.ce.framework.util.DateUtil;
import com.ce.framework.util.StringUtil;
import com.ce.framework.util.Uuid;
import com.ce.pub.message.view.PubMessageView;
import com.ce.sys.login.model.User;
import com.ce.sys.msg.view.MsgDefine;
import com.ce.sys.msg.view.SysMsgDefineView;
import com.ce.util.DbUtil;
import com.ce.util.TreeNode;

/**
* 嫦娥软件有限公司 版权所有 2013
* 创建人：　andy
* 创建日期：2013-03-22
* 创建时间：09:51:05
* 功能描述：系统消息定义表 [SYS_T_MSG$DEFINE]更改时用的Action
* ==============================================
* 修改历史
* 修改人		修改时间		修改原因
*
* ==============================================
*/
public class SysMsgDefineAction extends DataMaintainAction 
{
	private static final long serialVersionUID = 1L;

	private int interval;
	/**
	 * 开发人： andy
	 * 开发时间： 2013-3-22 下午03:29:02
	 * 功能描述：打开消息提示设置页面
	 * 方法的参数和返回值
	 * @return
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	@SuppressWarnings("unchecked")
	public String openSetSelfMsgPage(){
		//获取当前用户能设置的弹出信息配置项列表
		User user = User.getUser();
		if(user==null){
			return this.alertMsg("您尚未登录!");
		}
		//（根据当前用户所在角色的权限中是否包含配置项中设置的菜单id来控制）
		StringBuffer sql = new StringBuffer("select t.* from SYS_T_MSG$DEFINE t  " +
				"where   t.vc_del$flag = 0  " +
				(user.isSuperUser()?"":"and  (t.vc_action$id in " +
				"(select p.vc_menu$id from SYS_T_ROLE$PERMISS p  where  p.vc_role$id in " +
				"(select r.vc_role$id  from sys_t_account$role r   where r.vc_user$id = '"+
				user.getVcId()+"') or p.vc_role$id ='common' ) or t.n_flag=1)")+
			    " order by t.n_flag,t.vc_name");
		List<SysMsgDefineView> allOplist = (List<SysMsgDefineView>)DbUtil.executeSqlQuery(sql.toString(), new ISQLMapper(){
			public Object fromSQLQuery(ResultSet rs, int num) {
				// TODO Auto-generated method stub
				SysMsgDefineView view = new SysMsgDefineView();
				try {
					view.setVcId(rs.getString("VC_ID"));
					view.setVcName(rs.getString("VC_NAME"));
					view.setVcSql(rs.getString("VC_SQL"));
					view.setVcTitle(rs.getString("VC_TITLE"));
					view.setVcUrl(rs.getString("VC_URL"));
					view.setVcRescId(rs.getString("VC_RESC$ID"));
					view.setNflag(rs.getInt("N_FLAG"));
					view.setVcDelFlag(rs.getString("VC_DEL$FLAG"));
					view.setVcActionId(rs.getString("VC_ACTION$ID"));
				} catch (SQLException e) {
					e.printStackTrace();
				}
				return view;
			}
		});
		
		//获取当前用户已经选择的配置项
		sql = new StringBuffer("select t.vc_msg$id from sys_t_msg$personal$item t where t.vc_user$id ='"+User.getUserId()+"'");
		List<?> userOpList = DbUtil.executeSqlQuery(sql.toString(), new ISQLMapper(){
			public Object fromSQLQuery(ResultSet rs, int num) {
				// TODO Auto-generated method stub
				TreeNode view = new TreeNode();
				try {
                   view.setVcId(rs.getString("vc_msg$id"));
				} catch (SQLException e) {
					e.printStackTrace();
				}
				return view;
			}
		});
		
		//将用户选择的所有配置项组合成字符串
	    Iterator<?> it = (Iterator<?>) userOpList.iterator();
	    String msgIds = "";
	    while(it.hasNext()){
	    	TreeNode node = (TreeNode)it.next();
	    	msgIds = msgIds + node.getVcId(); 
	    }
		
	    //将用户所选择的配置项和所有配置项进行对比，当配置项中存在用户选择的配置项时，设置该配置项标志位为已选择
	    List<SysMsgDefineView> result = allOplist;
	    if(StringUtil.isNotBlank(msgIds)){
	    	result = new ArrayList<SysMsgDefineView>();
	    	it = allOplist.iterator();
	    	while(it.hasNext()){
	    		SysMsgDefineView view = (SysMsgDefineView)it.next();
	    		if(msgIds.indexOf(view.getVcId())>=0){
	    			view.setChooseId(view.getVcId());
	    		}
	    		result.add(view);
	    	}
	    }
		
		sql = new StringBuffer("select t2.N_INTERVAL from ")
		.append("SYS_T_MSG$PERSONAL t2 where t2.vc_user$id='")
		.append(this.getUser().getVcId())
		.append("'");
        //获取当前用户配置信息弹出的时间间隔设置
		this.interval = DbUtil.getFirstIntSqlQuery(sql.toString());
		if(this.interval<5)
			this.interval = 5;
		setAttribute("msgList", result);
		return "setMsgDefPage";
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-3-22 下午03:46:11
	 * 功能描述：保存用户的系统弹出消息配置
	 * 方法的参数和返回值
	 * @return
	 * @throws AppException
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	@SuppressWarnings("deprecation")
	public String setSelfMsgPage()throws AppException{
		String[] msgIds = getParameterValues("msgId");
		List<String> sqlList = new ArrayList<String>();
		String mid = Uuid.getUuid();
		//删除原有配置数据
		sqlList.add("delete SYS_T_MSG$PERSONAL$ITEM t where t.VC_USER$ID = '"+this.getUser().getVcId()+"'");
		sqlList.add("delete SYS_T_MSG$PERSONAL t where t.VC_USER$ID = '"+this.getUser().getVcId()+"'");
		//增加主表数据
		sqlList.add("insert into SYS_T_MSG$PERSONAL (VC_ID, VC_USER$ID, N_INTERVAL, VC_DEL$FLAG) values ('"+mid+"', '"+this.getUser().getVcId()+"', "+this.interval+", '0')");
		if(msgIds!=null){
			for(int i=0;i<msgIds.length;i++){
				String sql = "insert into SYS_T_MSG$PERSONAL$ITEM (VC_ID, VC_USER$ID, VC_MSG$ID, VC_DEL$FLAG) values ('"+Uuid.getUuid()+"', '"+User.getUserId()+"', '"+msgIds[i]+"', '0')";
				sqlList.add(sql);
			}	
		}
		int i = DbUtil.executeSqlUpdate(sqlList);
		getRequest().getSession().removeAttribute(MsgDefine.SAVE_ID_IN_SESSION);
		if(i>0){
			return super.returnInfoForJS(true, null);	
		}else{
			return super.returnInfoForJS(false, "数据没有正常保存！");
		}
		
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-4-20 上午11:34:37
	 * 功能描述：生成系统弹出信息
	 * 方法的参数和返回值
	 * @return
	 * @throws AppException
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	@SuppressWarnings("deprecation")
	public String getMsgString()throws AppException{
		StringBuffer msg = new StringBuffer("");
		Iterator<?> it = MsgDefine.getInstance(this.getRequest()).getMsgList().iterator();
		int i=1;
	    while(it.hasNext()){
	    	   SysMsgDefineView msgDef = (SysMsgDefineView)it.next();
	    	   msg.append("<a href=\"javascript:addTab('待办项目"+i+"','"+(msgDef.getVcUrl()).trim()+"')\">["+(i++)+"] "+msgDef.getVcTitle()+"</a><br>");
	    }
	    it = this.getNewMsg().iterator();
	    while(it.hasNext()){
	    	PubMessageView message = (PubMessageView)it.next();
	    	msg.append("<a href=\"javascript:openDialog('"+message.getVcSendUser()+"','"+message.getSendUserName()+"','"+message.getSendUserOrg()+"')\">"+(i++)+" "+message.getSendUserName()+"在"+message.getSendTimeStr()+"给您发送了消息，请点击查看！</a><br>");
	    }
	    return super.returnInfoForJS(true, msg.toString());   
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-7-1 上午11:51:54
	 * 功能描述：获取窗口标题滚动提示信息
	 * 方法的参数和返回值
	 * @return
	 * @throws AppException
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public String getTitleNotice()throws AppException{
		@SuppressWarnings("deprecation")
		int i = MsgDefine.getInstance(this.getRequest()).getMsgList().size()+this.getNewMsg().size();
		if(i>0)
		    return super.returnInfoForJS(true, "您目前有"+i+"条信息需要处理,请点击消息提示进行查看！");
		else
			return super.returnInfoForJS(false, "");
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-4-20 上午11:34:31
	 * 功能描述： 获取当前用户需要接收、的短消息
	 * 方法的参数和返回值
	 * @return
	 * List 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	private List<?> getNewMsg(){
		List<?> msgList = new ArrayList<Object>();
		String sql = "select m.vc_send$user,m.vc_content,p.vc_name as sendusername,m.dt_time,o.VC_NAME as orgName    from pub_t_message m ,sys_t_person p,sys_v_org$dep o where  " +
				"m.vc_send$user = p.vc_id(+) and p.vc_org$id = o.VC_ID(+)  and m.vc_receive$user=? and m.int_see$flag = 0 order by vc_send$user";
		msgList = DbUtil.executeSqlQuery(sql, new ISQLMapper(){
			public Object fromSQLQuery(ResultSet rs, int num) {
				// TODO Auto-generated method stub
				PubMessageView msg = new PubMessageView();
				try{
					msg.setSendTimeStr(DateUtil.format(rs.getTimestamp("dt_time"),"yyyy-MM-dd HH:mm:ss"));
					msg.setVcContent(rs.getString("vc_content"));
				    msg.setSendUserName(rs.getString("sendusername"));
				    msg.setVcSendUser(rs.getString("vc_send$user"));
				    msg.setSendUserOrg(rs.getString("orgName"));
				}catch(Exception e){
					e.printStackTrace();
				}
				return msg;
			}
		},new Object[]{User.getUserId()});
		return msgList;
	}
	
	public int getInterval() {
		return interval;
	}
	public void setInterval(int interval) {
		this.interval = interval;
	}
}

